/**aPP应用程序与I2C通讯**/
/*在linux中找到链接ft5x06芯片挂载的i2c适配器通过
*访问挂载的I2c适配器文件/dev/i2c-xxx实现对触摸芯片的操作
*应用层访问iic设备主要通过结构体i2c_rdwr_ioctl_data的封装
*内包含结构 i2c_msg与nmsgs
*i2c_msg：主要的成员 addr 是我们从机的地址，flags 为读写标志位，
*如果 flags 为 1，则为读，反之为 0，则为写len 为 buf 的大小，
*单位是字节。当 flags 为 1 是
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <linux/ioctl.h>

int fd;
int ret;

/**函数参数说明
* @description: i2c_read_data i2c 读数据
* @param {unsignedint} slave_addr ：从机设备的地址
* @param {unsignedchar} reg_addr ：寄存器的地址
* @return {*}
*/
int i2c_read_data(unsigned int slave_addr,unsigned char reg_addr)
{
    unsigned char data;
    //定义一个要发送的数据包 i2c_read_lcd
    struct i2c_rdwr_ioctl_data i2c_read_lcd;
    //定义初始化i2c_msg结构体 ,作用实现对i2c设备访问相关数据的封装包含读写操作
    struct i2c_msg msg[2]={
        [0]={.addr=slave_addr,//设置从机地址
            .flags=0,        //设置读写方向
            .buf=&reg_addr,  //设置寄存器的地址
            .len=sizeof(reg_addr)},//设置寄存器的地址的长度
        [1]={.addr=slave_addr,//设置从机地址
            .flags=1,        //设置为读
            .buf=&data,      //设置寄存器的地址
            .len=sizeof(reg_addr)},//设置数据大小
    };
    //初始化数据包的数据
    i2c_read_lcd.msgs=msg;
    //初始化数据包的个数
    i2c_read_lcd.nmsgs=2;
    //操作读写数据包
    ret=ioctl(fd,I2C_RDWR,&i2c_read_lcd);
    if(ret<0)
    {
        perror("ioctl error");
        return ret;
    }
    return data;
}

int main()
{
    int TD_STATUS;
    fd=open("/dev/i2c-1",O_RDWR);
    if(fd<0)
    {
        //打开设备节点失败
        perror("open error! \n");
        return fd;
    }
    while(1)
    {
        //i2C 读从机地址为 0x38，寄存器地址为 0x02 的数据
        //我们从数据手册中得知 TD_STATUS 的地址为 0x02
        TD_STATUS=i2c_read_data(0x38,0x02);//读取从设备地址为0x38的设备访问设备的0x02的寄存器
        //打印TD_STATUS的值
        printf("TD_STATUS value is: %d \n",TD_STATUS);
        sleep(1);
    }
    close(fd);
    return 0;
}
